#ifdef _RMS_TOML_

#include <stdio.h>
#include "cint.h"


CInteger::CInteger(int base, string s)
{
  mpz_init_set_str(Data, s.c_str(), base);
}

CInteger::CInteger(unsigned char* dat, int len)
{
  Load(dat, len);
}

void CInteger::Load(unsigned char* dat, int len)
{
  int i;
  int tmpsize = len*2+2;
  char* tmp = (char*) malloc(tmpsize);
  memset(tmp, 0, tmpsize);

  char hex[] = "0123456789abcdef";

  for(i=0; i<len; i++)
  {
    tmp[2*i  ] = hex[dat[i]>>4];
    tmp[2*i+1] = hex[dat[i] & 0xf];
  }
  mpz_init_set_str(Data, tmp, 16);
  free(tmp);
}

int CInteger::GetData(unsigned char* dat, int len)
{
  memset(dat, 0, len);
  int i, j, c=0;
  int l = mpz_sizeinbase(Data, 16) + 2;
  if((l-1)/2>len) return -1;
  char* tmp = (char*) malloc(l);
  mpz_get_str(tmp, 16, Data);
  if(tmp[i=0]=='-'){i++;/* m.b. print warning */};
  string s( &tmp[i] );
  if(s.length()%2!=0) s = "0"+s;
  l = s.length();

// == init hex begin ==
  char digits1[] = "0123456789abcdef";
  char digits2[] = "ABCDEF";
  char back[256];
  memset(back, 100, 256);
  for(i=0; i<16; i++) back[digits1[i]]=i;
  for(i=0; i<6; i++) back[digits2[i]]=i+10;
// == init hex end ==

  for(i=0; i<l; i+=2)
    dat[len - l/2 + i/2] = (back[s[i]]<<4) + back[s[i+1]];

// data:              0x00-0a-bc-de-f0
//                         01 23 45 67 // l=8
// number: 00-00-00-00- 00-0a-bc-de-f0
//                         5 - 4 + 3 = 4
// get (len=5)          00-0a-bc-de-f0
//                       0  1  2  3  4
  free(tmp);
  return l/2;
}

string CInteger::GetNumber(int base)
{
  char* tmp = (char*) malloc(mpz_sizeinbase(Data,base)+2);
  mpz_get_str(tmp, base, Data);
  string res(tmp);
  free(tmp);
  return res;
}


int CInteger::GetLength()
{
  return (mpz_sizeinbase(Data, 16) + 1)/2;
}


void CInteger::powmod(const CInteger& base, const CInteger& power, const CInteger& module)
{
  mpz_powm(Data, base.Data, power.Data, module.Data);
}

CInteger::~CInteger()
{
  mpz_clear(Data);
}


#endif